﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

using UnisysMassiveImporter_v2.Negocio.Administrators;
using UnisysMassiveImporter_v2.Entidades.Configuracion;
using UnisysMassiveImporter_v2.Entidades.Mensajes;
using UnisysMassiveImporter_v2.Datos.Archivos;


namespace UnisysMassiveImporter_v2
{
    public partial class UnisysMassiveImporter : ServiceBase
    {

        
        private InfoMessage infoMessage;
        private CriticalMessage criticalMessage;

        public UnisysMassiveImporter()
        {
            InitializeComponent();
        }

        private static String convertEmailAccounTo(System.Collections.ArrayList emailAccountTo)
        {
            String mails="";
            for (int i = 0; i < emailAccountTo.Count; i++)
            {
                String mail = (String)emailAccountTo[i];
                if (i == emailAccountTo.Count - 1)
                    mails += mail;
                else
                    mails += mail + ",";
            }
            return mails;
        }

        protected override void OnStart(string[] args)
        {
            Configuration appConfig=new Configuration();
            #region Load Configuration
            
            try
            {
                appConfig = Configuration.Load();
            }
            catch (Exception e)
            {
                Logger.LogThis4Windows("Error al intentar leer la configuracion de la aplicacion " + e.Message, "Unisys Masive Importer", "Unisys Masive Service");
                System.Environment.Exit(0);
            }
            infoMessage = new InfoMessage();
            infoMessage.sendMessage("El sistema ha levantado su configuracion", InfoMessage.Information_Message, 530, "System",ref appConfig);

            //emailAccountTo falta
            infoMessage.sendMessage("Configuracion cargada correctamente con los siguientes parametros:\n historyGeneration: ["
                    + appConfig.historyGeneration.ToString() + "] \n fileSystemHistory: [" + appConfig.fileSystemHistory + "] \n logLocation: ["
                    + appConfig.logLocation + "] \n config_threadLocation: [" +
                appConfig.config_threadLocation + "]  "+
                "\n mailAccountTo: [" + convertEmailAccounTo(appConfig.emailAccountTo) + "]"+
                " \n logSize: [" + appConfig.logSize + "] \n fileSystemError: [" + appConfig.fileSystemError + "]"+
            "\n system: [" + appConfig.system + "] \n maxFiles: [" + appConfig.maxFiles + "]",
                    InfoMessage.Information_Message, 559, "System", ref appConfig);

            #endregion

            #region Verificar APP Configuracion

            ConfigAdminitrator configAdmin = new ConfigAdminitrator();
            if (configAdmin.CheckAppConfig(ref appConfig))
            {
                infoMessage.sendMessage("Configuracion de la aplicacion verificada", InfoMessage.Information_Message, 531, "System", ref appConfig);
                System.IO.DirectoryInfo configThreads = new System.IO.DirectoryInfo(appConfig.config_threadLocation);
                if (configThreads.Exists)
                {
                    infoMessage.sendMessage("Buscando configuracion de los Threads", InfoMessage.Information_Message, 532, "System", ref appConfig);

                    foreach (System.IO.FileInfo file in configThreads.GetFiles())
                        if (file.Extension.ToLower().Equals(".xml"))
                        {
                            infoMessage.sendMessage("Archivo: " + file.FullName + " encontrado.", InfoMessage.Information_Message, 533, "System", ref appConfig);
                            try
                            {
                                infoMessage.sendMessage("Cargando configuracion del archivo: " + file.FullName, InfoMessage.Information_Message, 534, "System", ref appConfig);
                                Thread_Config threadConfig = Thread_Config.Cargar(file.FullName,ref  appConfig);
                                if (!(configAdmin.CheckThreadConfig(threadConfig, ref appConfig)))
                                    criticalMessage.sendMessage("El thread: " + threadConfig.Name + " no fue creado, por problemas de configuracion.", new Exception("La configuracion "), CriticalMessage.Configuration_Error, 61, "System", true, ref appConfig);
                            }
                            catch (Exception e)
                            {
                                criticalMessage.sendMessage("Error al cargar el archivo de configuracion: " + file.FullName + ". El thread no fue creado.", e, CriticalMessage.Critical_Error, 2, "System", true, ref appConfig);
                            }
                        }
                        else
                            infoMessage.sendMessage("Archivo: " + file.FullName + " omitido, no es un archivo de configuracion", InfoMessage.Information_Message, 535, "System", ref appConfig);

                }
                else
                    criticalMessage.sendMessage("Error de configuracion en la aplicacion, no se encontro la carpeta: " + configThreads.FullName, new Exception("La carpeta " + configThreads.FullName + " no exite"), CriticalMessage.Configuration_Error, 52, "System", true, ref appConfig);

            }
            else
            {
                criticalMessage.sendMessage("Error de configuracion en la aplicacion", new Exception("La configuracion no se encuentra bien realizada"), CriticalMessage.Critical_Error, 3, "System", true, ref appConfig);
            }
            #endregion


            #region iniciar configuracion de los threads
            infoMessage.sendMessage("La comprobacion de la configuracion a finalizado se procede a subir los threads", InfoMessage.Information_Message, 536, "System", ref appConfig);
            System.IO.DirectoryInfo configThread = new System.IO.DirectoryInfo(appConfig.config_threadLocation);
            if (configThread.Exists)
            {
                foreach (System.IO.FileInfo file in configThread.GetFiles())
                    if (file.Extension.ToLower().Equals(".xml"))
                    {
                        try
                        {
                            infoMessage.sendMessage("Cargando archivo " + file.FullName, InfoMessage.Information_Message, 534, "System", ref appConfig);
                            TaskAdministrator taskManager = new TaskAdministrator();
                            Thread_Config thread=Thread_Config.Cargar(file.FullName, ref appConfig);
                            infoMessage.sendMessage("La configuracion del archivo " + file.FullName + " ha sido cargada correctamente", InfoMessage.Success_Message, 263, "System",ref appConfig);
                            taskManager.Start(appConfig,thread);
                            //hilos.Add(t);
                        }
                        catch (Exception e)
                        {
                            criticalMessage = new CriticalMessage();
                            criticalMessage.sendMessage("Imposible cargar la configuracion del archivo: " + file.FullName, e, CriticalMessage.Critical_Error, 4, "System", true, ref appConfig);
                        }
                    }
            }
            else
            {
                criticalMessage = new CriticalMessage();
                criticalMessage.sendMessage("Error de configuracion en la aplicacion, no se encontro la carpeta: " + configThread.FullName, new Exception("La carpeta " + configThread.FullName + " no exite"), CriticalMessage.Configuration_Error, 52, "System", true, ref appConfig);
            }

            #endregion
        }

        protected override void OnStop()
        {
        }
    }
}
